package br.com.werp.regras.pessoa.controle;

import br.com.werp.regras.geral.Auditoria;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.Sequenciador;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.pessoa.ContatoVO;
import br.com.werp.regras.geral.vos.pessoa.PessoaVO;
import br.com.werp.regras.geral.vos.tabelas.Contato;
import br.com.werp.regras.geral.vos.tabelas.Endereco;
import br.com.werp.regras.pessoa.integracao.ContatoDAO;
import br.com.werp.regras.pessoa.integracao.FabricaDAO;

import org.apache.commons.beanutils.BeanUtils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/**
 * @author Sobreira
 * Criado em 27/12/2004
 *
 */
public class ControleContato {
    /**
     * Pessiste um contato no banco
     */
    public void persistirContato(Object key, String userId,
        ContatoVO contatoVO, String op) throws Exception {
        Sequenciador sequenciador = FabricaSubSistema.getSequenciador();
        int cont_id = sequenciador.obterProximoId(Sequenciador.CONTATO);
        ContatoDAO contatoDAO = FabricaDAO.getContatoDAO();
        Contato contato = new Contato();

        BeanUtils.copyProperties(contato, contatoVO);
        contato.setCont_id(cont_id);
        contatoDAO.inserirContato(key, contato);

        Auditoria auditoria = FabricaSubSistema.getAuditoria();
        auditoria.auditarRecurso(key, userId, contato, op);

        if (contatoVO.getEndereco() != null) {
            Endereco endereco = contatoVO.getEndereco();
            endereco.setEndr_contato(cont_id);
            contatoDAO.inserirEndereco(key, endereco);
            auditoria.auditarRecurso(key, userId, endereco, op);
        }
    }

    /**
     * Pessiste uma lista contato no banco
     */
    public void persistirContatos(Object conn, String usuario,
        PessoaVO pessoaVO, String op) throws Exception {
        if ((pessoaVO.getContatos() != null) &&
                !pessoaVO.getContatos().isEmpty()) {
            List list = pessoaVO.getContatos();

            if (Auditoria.ALTERAR.equals(op)) {
                apagarTodosContatos(conn, pessoaVO);
            }

            for (Iterator iter = list.iterator(); iter.hasNext();) {
                ContatoVO contatoVO = (ContatoVO) iter.next();
                contatoVO.setCont_pessoa(pessoaVO.getPess_id());
                persistirContato(conn, usuario, contatoVO, op);
            }
        }
    }

    /**
     * Apaga os contatos para um pessoa
     * @param conn
     * @param pessoaVO
     * @throws Exception
     */
    public void apagarTodosContatos(Object conn, PessoaVO pessoaVO)
        throws Exception {
        ContatoDAO contatoDAO = FabricaDAO.getContatoDAO();
        List contatosTela = pessoaVO.getContatos();
        String tipo_contato = "";

        for (Iterator iterator = contatosTela.iterator(); iterator.hasNext();) {
            ContatoVO contatoVO = (ContatoVO) iterator.next();
            tipo_contato = contatoVO.getCont_tipo_contato();

            if ((tipo_contato != null) &&
                    (tipo_contato.endsWith("COMERCIAL") ||
                    tipo_contato.endsWith("TESOURARIA") ||
                    tipo_contato.endsWith("PRODUCAO") ||
                    tipo_contato.endsWith("CADASTRO"))) {
                break;
            }
        }

        if (!Util.isNullOrEmpty(tipo_contato)) {
            String[] arrayFimTipo = tipo_contato.split("_");
            tipo_contato = arrayFimTipo[arrayFimTipo.length - 1];
        }

        List contatos = obterContatos(String.valueOf(pessoaVO.getPess_id()));

        for (Iterator iter = contatos.iterator(); iter.hasNext();) {
            ContatoVO contatoVO = (ContatoVO) iter.next();

            String tipoBanco = contatoVO.getCont_tipo_contato();

            if (((tipoBanco != null) && tipoBanco.endsWith(tipo_contato)) ||
                    "TELEFONE_CELULAR".equals(tipoBanco) ||
                    "EMAIL".equals(tipoBanco)) {
                contatoDAO.apagarEndereco(conn, contatoVO.getCont_id());
                contatoDAO.apagarContato(conn, contatoVO.getCont_id());
            }
        }
    }

    /**
     * Apaga os contatos para um pessoa e gera auditoria
     * @param conn
     * @param pessoaVO
     * @throws Exception
     */
    public void apagarTodosContatos(Object conn, PessoaVO pessoaVO,
        String usuario) throws Exception {
        ContatoDAO contatoDAO = FabricaDAO.getContatoDAO();
        List contatos = obterContatos(String.valueOf(pessoaVO.getPess_id()));

        for (Iterator iter = contatos.iterator(); iter.hasNext();) {
            ContatoVO contatoVO = (ContatoVO) iter.next();
            contatoDAO.apagarEndereco(conn, contatoVO.getCont_id());
            contatoDAO.apagarContato(conn, contatoVO.getCont_id());

            Contato contato = new Contato();
            BeanUtil.copiarVO(contatoVO, contato);

            Auditoria auditoria = FabricaSubSistema.getAuditoria();
            auditoria.auditarRecurso(conn, usuario, contato, Auditoria.EXCLUIR);
        }
    }

    public Contato obterContato(String pessoaId, String tpContato)
        throws Exception {
        Contato contato = new Contato();
        contato.setCont_pessoa(Util.zeroOuInt(pessoaId));
        contato.setCont_tipo_contato(tpContato);

        ContatoDAO contatoDAO = FabricaDAO.getContatoDAO();

        contato = (Contato) Util.get0(contatoDAO.obterContato(contato));

        return contato;
    }

    public Endereco obterEndereco(String contatoId) throws Exception {
        Endereco endereco = new Endereco();
        endereco.setEndr_contato(Util.zeroOuInt(contatoId));

        ContatoDAO contatoDAO = FabricaDAO.getContatoDAO();

        endereco = (Endereco) Util.get0(contatoDAO.obterEndereco(endereco));

        return endereco;
    }

    public List obterContatos(String pessId) throws Exception {
        ContatoDAO contatoDAO = FabricaDAO.getContatoDAO();
        List contatos = contatoDAO.obterContatos(pessId);
        List retorno = new ArrayList();

        for (Iterator iter = contatos.iterator(); iter.hasNext();) {
            Contato contato = (Contato) iter.next();
            ContatoVO contatoVO = new ContatoVO();
            BeanUtils.copyProperties(contatoVO, contato);

            Endereco endereco = new Endereco();
            endereco.setEndr_contato(contato.getCont_id());
            endereco = (Endereco) Util.get0(contatoDAO.obterEndereco(endereco));
            contatoVO.setEndereco(endereco);
            retorno.add(contatoVO);
        }

        return retorno;
    }

    public static void main(String[] args) throws Exception {
        ControleContato contato = new ControleContato();
        System.out.println(contato.obterContatos("12"));
    }
}
